/**
 * slice() 方法返回一个新的数组对象，这一对象是一个由 start 和 end 决定的原数组的浅拷贝（包括 start，不包括 end），
 * 其中 start 和 end 代表了数组元素的索引。原始数组不会被改变。
 *
 *
 * 不传start则start取0，不传end，end取数组长度
 *
 * 1. 如果start大于数组长度，返回空数组，如果end大于数组长度，end取数组长度
 * 2. 如果start是负数，则数组长度加上start，如果结果为负数，则取0
 * 3. 同样，如果end是负数，则数组长度加上end,如结果为负数，则取0
 * 4. 如果取正值后start还是大于end，返回[]
 *
 * @param {*} start
 * @param {*} end
 * return undefined/新数组
 */
Array.prototype.mySlice = function (start, end) {
  if (!Array.isArray(this)) throw new TypeError("musted be called by array");

  if (this.length === 0) return undefined;

  //   不传start则start取0，不传end，end取数组长度
  start = start === undefined ? 0 : start;
  end = end === undefined ? this.length : end;

  if (typeof start != "number" || Number.isNaN(start))
    throw new Error("start is a number 项目经理打电话过来，周末要加班，裂开");
  if (typeof end != "number" || Number.isNaN(end))
    throw new Error("end is a number 项目经理打电话过来，周末要加班，裂开");

  const result = [];
  // 如果start大于数组长度，返回空数组，如果end大于数组长度，end取数组长度
  if (start > this.length) {
    return result;
  }

  //   取正值
  if (start < 0) {
    start = Math.max(this.length + start, 0);
  }
  if (end < 0) {
    end = Math.max(this.length + end, 0);
  }

  // 如果取正值后的end还大于数组长度，取数组长度
  if (end > this.length) {
    end = this.length;
  }

  // 处理后start大于end，返回空数组
  if (start > end) {
    return result;
  }

  for (let i = start; i < end; i++) {
    result.push(this[i]);
  }

  return result;
};

// egg
let arr = [1, 2, 3, 4];
console.log("[ arr ] >", arr.mySlice(1, 3));
console.log("[ arr ] >", arr.mySlice(-1, 4));
console.log("[ arr ] >", arr.mySlice(1, -1));

let arr1 = [1, 2, 3, 4];
console.log("[ arr ] >", arr1.slice(1, 3));
console.log("[ arr ] >", arr1.slice(-1, 4));
console.log("[ arr ] >", arr1.slice(1, -1));
